<!DOCTYPE html>
<html>
	<head>
		<title>three.js css3d - panorama</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
		<style>
			html{
				width: 100%;
				height: 100%;
			}
			body {
				background-color: #000000;
				margin: 0;
				cursor: move;
				overflow: hidden;
				position: relative;
			}
		</style>
	</head>
	<body id="content">
		<script src="./js/three.min.js"></script>
		<script src="./js/CSS3DRenderer.js"></script>
		<script src="./js/portrait.js"></script>

		<script>
			var beta,gamma;
			var camera, scene, renderer;
			var geometry, material, mesh;
			var target = new THREE.Vector3();
			var lon = 90, lat = 0;
			var phi = 0, theta = 0;
			var touchX, touchY;
			window.onload = function(){
				portrait(function(key){
					window.key = key
					init(key);
					animate(key);
				});
			}
			function init(key) {
				camera = new THREE.PerspectiveCamera( 75, W / H, 1, 1000 );
				scene = new THREE.Scene();
				var sides = [
					{
						url: 'img/preview_02.png',
						position: [ -512, 0, 0 ],
						rotation: [ 0, Math.PI / 2, 0 ]
					},
					{
						url: 'img/preview_04.png',
						position: [ 512, 0, 0 ],
						rotation: [ 0, -Math.PI / 2, 0 ]
					},
					{
						url: 'img/preview_05.png',
						position: [ 0,  512, 0 ],
						rotation: [ Math.PI / 2, 0, Math.PI ]
					},
					{
						url: 'img/preview_06.png',
						position: [ 0, -512, 0 ],
						rotation: [ - Math.PI / 2, 0, Math.PI ]
					},
					{
						url: 'img/preview_01.png',
						position: [ 0, 0,  512 ],
						rotation: [ 0, Math.PI, 0 ]
					},
					{
						url: 'img/preview_03.png',
						position: [ 0, 0, -512 ],
						rotation: [ 0, 0, 0 ]
					}
				];
				for ( var i = 0; i < sides.length; i ++ ) {
					var side = sides[ i ];
					var element = document.createElement( 'img' );
					element.width = 1026; // 2 pixels extra to close the gap.
					element.src = side.url;
					var object = new THREE.CSS3DObject( element );
					object.position.fromArray( side.position );
					object.rotation.fromArray( side.rotation );
					scene.add( object );
				}
				renderer = new THREE.CSS3DRenderer();
				renderer.setSize( W, H );
				document.body.appendChild( renderer.domElement );
				//
				document.addEventListener( 'mousedown', onDocumentMouseDown, false );
				document.addEventListener( 'wheel', onDocumentMouseWheel, false );
				document.addEventListener( 'touchstart', onDocumentTouchStart, false );
				document.addEventListener( 'touchmove', onDocumentTouchMove, false );
				window.addEventListener( 'resize', onWindowResize, false );
				window.addEventListener('devicemotion', function(e){
					if(beta && beta >= e.accelerationIncludingGravity.y){
						lon -=  0.5;
						lat = Math.max( - 85, Math.min( 85, lat ) );
					} 
					if(beta && beta < e.accelerationIncludingGravity.y){
						lon +=  0.4;
						lat = Math.max( - 85, Math.min( 85, lat ) );
					} 
					// alert(e.beta)
					if(typeof beta == 'undefined'){
						beta = e.accelerationIncludingGravity.y
					}
				}, false);
			}
			function onWindowResize() {
				camera.aspect = W / H;
				camera.updateProjectionMatrix();
				renderer.setSize( W, H );
			}
			function onDocumentMouseDown( event ) {
				event.preventDefault();
				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
				document.addEventListener( 'mouseup', onDocumentMouseUp, false );
			}
			function onDocumentMouseMove( event ) {
				var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
				var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
				lon -= movementX * 0.1;
				lat += movementY * 0.1;
			}
			function onDocumentMouseUp( event ) {
				document.removeEventListener( 'mousemove', onDocumentMouseMove );
				document.removeEventListener( 'mouseup', onDocumentMouseUp );
			}
			function onDocumentMouseWheel( event ) {
				var fov = camera.fov + event.deltaY * 0.05;
				camera.fov = THREE.Math.clamp( fov, 10, 75 );
				camera.updateProjectionMatrix();
			}
			function onDocumentTouchStart( event ) {
				event.preventDefault();
				var touch = event.touches[ 0 ];
				touchX = touch.screenX;
				touchY = touch.screenY;
			}
			function onDocumentTouchMove( event ) {
				event.preventDefault();
				var touch = event.touches[ 0 ];
				if (window.key) {
					lat -= ( touch.screenX - touchX ) * 0.1;
					lon -= ( touch.screenY - touchY ) * 0.1;
				} else {
					lon -= ( touch.screenX - touchX ) * 0.1;
					lat += ( touch.screenY - touchY ) * 0.1;
				}
				touchX = touch.screenX;
				touchY = touch.screenY;
			}
			function animate(key) {
				requestAnimationFrame( animate );
				lon +=  0.1;
				lat = Math.max( - 85, Math.min( 85, lat ) );
				phi = THREE.Math.degToRad( 90 - lat );
				theta = THREE.Math.degToRad( lon );
				target.x = Math.sin( phi ) * Math.cos( theta );
				target.y = Math.cos( phi );
				target.z = Math.sin( phi ) * Math.sin( theta );
				camera.lookAt( target );
				renderer.render( scene, camera );
			}
		</script>
	</body>
</html>